home *** CD-ROM | disk | FTP | other *** search
/ Aminet 23 / Aminet 23 (1998)(GTI - Schatztruhe)[!][Feb 1998].iso / Aminet / dev / src / CdBS_KQSrc0_3.lha / KaliosysQuantrum / Copper.s < prev    next >
Text File  |  1997-11-01  |  7KB  |  339 lines

  1. *
  2. * CdBSian Obviously Universal & Interactive Nonsense (COUIN)
  3. * (Absurdité CdBSienne Manifestement Universelle et Interactive)
  4. * ©1997, CdBS Software (MORB)
  5. * Copper routine
  6. * $Id: Copper.s 0.5 1997/09/09 00:07:05 MORB Exp MORB $
  7. *
  8.  
  9. _CopperTable:
  10.          ds.l      1
  11. _CurrentCopperTable:
  12.          ds.l      1
  13. _Wait255Addr:
  14.          ds.l      1
  15. _Wait255:
  16.          ds.b      1
  17.          even
  18.  
  19. _MergeCopperLists:
  20.          movem.l   d0-7/a0-6,-(a7)
  21.  
  22.          move.l    #$00960000,d1
  23.  
  24.          lea       _Wait255Addr,a0
  25.          move.l    (a0),d0
  26.          beq.s     .Schglubulu
  27.  
  28.          move.l    d0,a1
  29.          move.l    d1,(a1)
  30.  
  31. .Schglubulu:
  32.  
  33.          clr.l     (a0)
  34.          sf        _Wait255
  35.  
  36.          lea       _CopperRepairBuffer,a0
  37.  
  38. .Loop:
  39.          move.l    (a0)+,d0
  40.          beq.s     RepairDone
  41.          move.l    d0,a1
  42.          move.l    d1,(a1)+
  43.          move.l    d1,(a1)+
  44.          move.l    d1,(a1)
  45.          bra.s     .Loop
  46.  
  47. RepairDone:
  48.          move.l    _CopperTable(pc),_CurrentCopperTable
  49.          lea       _CopperRepairBuffer,a5
  50.          lea       _MergeCopTmp,a6
  51.  
  52. CTLoop:
  53.          move.l    a6,a1
  54.          move.l    _CurrentCopperTable(pc),a4
  55.          lea       4(a4),a0
  56.  
  57. .InitLoop:
  58.          move.l    (a0)+,d0
  59.          bmi.s     InitDone
  60.          move.l    d0,a2
  61.          sf        d0
  62.  
  63. .Loop:
  64.          move.l    a2,d1
  65.          beq.s     .Done
  66.          move.w    ce_YPos(a2),d1
  67.          beq.s     .Done
  68.          bpl.s     .CheckPrev
  69.          move.l    a2,a3
  70.          tst.w     ce_Type(a2)
  71.          sne       d0
  72.          move.l    (a2),a2
  73.          bra.s     .Loop
  74.  
  75. .CheckPrev:
  76.          tst.b     d0
  77.          beq.s     .Done
  78.          move.l    a3,a2
  79.  
  80. .Done:
  81.          move.l    a2,(a1)+
  82.          move.l    ce_YPos(a2),(a1)+
  83.          bra.s     .InitLoop
  84. InitDone:
  85.          moveq     #-1,d0
  86.          move.l    d0,(a1)
  87.  
  88.          move.l    (a4),a4
  89.          moveq     #0,d6
  90.          moveq     #0,d2
  91.  
  92.          moveq     #$20,d3   ; <----- provisoire (définitif)
  93.  
  94. .Loop:
  95.          move.l    a6,a0
  96.          moveq     #0,d7
  97.          bset      #31,d7
  98.          not.l     d7
  99.  
  100. .LLoop:
  101.          move.l    (a0)+,d0
  102.          beq.s     .Couin
  103.          bmi.s     .ProcessEntry
  104.          move.l    (a0)+,d1
  105.          cmp.l     d7,d1
  106.          bgt.s     .LLoop
  107.          move.l    d1,d7
  108.          move.l    d0,a2
  109.          move.l    a0,d4
  110.          bra.s     .LLoop
  111. .Couin:
  112.          addq.l    #4,a0
  113.          bra.s     .LLoop
  114.  
  115. .ProcessEntry:
  116.          cmp.l     #$00fffffe,d7
  117.          bne.s     .NonRien
  118.          st        _Wait255
  119. .NonRien:
  120.  
  121.          swap      d7
  122.  
  123.          tst.b     _Wait255
  124.          bne.s     .W255Ok
  125.  
  126.          move.w    #256,d0
  127.          cmp.w     d0,d7
  128.          bcs.s     .W255Ok
  129.  
  130.          st        _Wait255
  131.          tst.w     d6
  132.          bne.s     .Block
  133.          move.l    #$ffe1fffe,(a4)+
  134.          bra.s     .W255Ok
  135.  
  136. .Block:
  137.          sub.w     d6,d0
  138.          mulu      d5,d0
  139.          lea       (a4,d0.l),a0
  140.          move.l    #$ffe1fffe,(a0)
  141.          move.l    a0,_Wait255Addr
  142.  
  143. .W255Ok:
  144.  
  145.          move.l    d4,a0
  146.          subq.l    #8,a0
  147.  
  148.          move.w    ce_Type(a2),d0
  149.          bpl.s     .Long
  150.  
  151.          cmp.w     d7,d3
  152.          beq.s     .Chain
  153.          move.w    d7,d3
  154.  
  155.          move.l    ce_Data(a2),d0
  156.          bsr.s     InsertCopperJump
  157.  
  158.          move.l    d0,a3
  159.  
  160.          bra.s     .NextEntry
  161.  
  162. .Chain:
  163.          move.l    ce_Data(a2),d0
  164.  
  165.          move.w    #$86,d1
  166.          swap      d1
  167.          move.w    d0,d1
  168.          move.l    d1,(a3)+
  169.          swap      d0
  170.          move.w    #$84,d1
  171.          swap      d1
  172.          move.w    d0,d1
  173.          move.l    d1,(a3)
  174.          swap      d0
  175.  
  176.          move.l    d0,a3
  177.  
  178.          bra.s     .NextEntry
  179.  
  180. .Long:
  181.          bne.s     .Break
  182.  
  183.          move.l    a0,a6
  184.          move.l    ce_Data(a2),d4
  185.          move.l    d4,d0
  186.  
  187.          moveq     #0,d3
  188.  
  189.          tst.l     ce_SubType(a2)
  190.          beq.s     .NoMansLand
  191.          move.l    ce_BytesPerLine(a2),d5
  192.          move.w    d3,d1
  193.          move.w    d7,d3
  194.  
  195.          cmp.w     d7,d1
  196.          ble.s     .NoMansLand
  197.  
  198.          sub.w     d1,d3
  199.          mulu      d5,d3
  200.          add.l     d3,d0
  201.  
  202.          move.w    d7,d3
  203.  
  204. .NoMansLand:
  205.          bsr.s     InsertCopperJump
  206.          move.l    d4,a4
  207.          move.w    d3,d6
  208.          moveq     #0,d2
  209.          moveq     #0,d3
  210.  
  211. .NextEntry:
  212.          move.l    (a2),a1
  213.          move.l    a1,(a0)
  214.          move.l    ce_YPos(a1),4(a0)
  215.          bra.s     .Loop
  216.  
  217. .Break:
  218.          move.l    ce_Data(a2),d0
  219.          beq.s     .Terminate
  220.  
  221.          bsr.s     InsertCopperJump
  222.  
  223.          move.l    ce_CopperTable(a2),_CurrentCopperTable
  224.          bra.s     CTLoop
  225.  
  226. .Terminate:
  227.          bsr.s     TerminateChain
  228.  
  229.          tst.w     d6
  230.          bne.s     .AllDone
  231.          moveq     #-2,d0
  232.          move.l    d0,(a4)
  233. .AllDone:
  234.  
  235.          clr.l     (a5)
  236.          movem.l   (a7)+,d0-7/a0-6
  237.          rts
  238.  
  239. TerminateChain:
  240.          tst.l     d2
  241.          beq.s     .Done
  242.  
  243.          move.w    #$86,d1
  244.          swap      d1
  245.          move.w    d2,d1
  246.          move.l    d1,(a3)+
  247.          swap      d2
  248.          move.w    #$84,d1
  249.          swap      d1
  250.          move.w    d2,d1
  251.          move.l    d1,(a3)
  252.  
  253. .Done:
  254.          rts
  255.  
  256. InsertCopperJump: ; d0=Dest
  257.          bsr.s     TerminateChain
  258.  
  259.          tst.l     d6
  260.          beq.s     NoMansLand
  261.  
  262.          moveq     #CET_BREAK,d1
  263.          cmp.w     ce_Type(a2),d1
  264.          beq.s     .Late
  265.  
  266.          moveq     #CET_LATE,d1
  267.          cmp.w     ce_Type(a2),d1
  268.          bne.s     .NoLate
  269.  
  270. .Late:
  271.          move.l    d0,a1
  272.          move.l    #$c9fffe00,d1
  273.          move.b    d7,d1
  274.          ror.l     #8,d1
  275.  
  276.          move.l    d1,8(a1)
  277. .NoLate:
  278.  
  279.          sub.w     d6,d7
  280.          mulu      d5,d7
  281.          move.l    a4,a3
  282.          add.l     d7,a3
  283.          add.l     d5,a3
  284.  
  285.          subq.l    #8,a3
  286.          subq.l    #4,a3
  287.  
  288.          move.l    a3,(a5)+
  289.  
  290.          move.w    #$86,d1
  291.          swap      d1
  292.          move.w    d0,d1
  293.          move.l    d1,(a3)+
  294.          swap      d0
  295.          move.w    #$84,d1
  296.          swap      d1
  297.          move.w    d0,d1
  298.          move.l    d1,(a3)+
  299.          move.l    #$008a0000,(a3)+
  300.          swap      d0
  301.  
  302.          move.l    a3,d2
  303.          rts
  304.  
  305. NoMansLand:
  306.          move.l    #$01fffe00,d1
  307.          move.b    d7,d1
  308.          ror.l     #8,d1
  309.          move.l    d1,(a4)+
  310.  
  311.          moveq     #CET_BREAK,d2
  312.          cmp.w     ce_Type(a2),d2
  313.          beq.s     .Late
  314.  
  315.          moveq     #CET_LATE,d2
  316.          cmp.w     ce_Type(a2),d2
  317.          bne.s     .NoLate
  318.  
  319. .Late:
  320.          move.l    d0,a1
  321.          or.l      #$c80000,d1
  322.          move.l    d1,8(a1)
  323.  
  324. .NoLate:
  325.  
  326.          move.w    #$86,d1
  327.          swap      d1
  328.          move.w    d0,d1
  329.          move.l    d1,(a4)+
  330.          swap      d0
  331.          move.w    #$84,d1
  332.          swap      d1
  333.          move.w    d0,d1
  334.          move.l    d1,(a4)+
  335.          move.l    #$008a0000,(a4)+
  336.          swap      d0
  337.          move.l    a4,d2
  338.          rts
  339.